<?php

namespace app\admin\controller;

use think\Controller;
use think\Db;

/**
 * 管理员基础控制器
 * 所有需要认证的控制器都继承此类
 */
class Base extends Controller
{
    /**
     * 当前登录的管理员信息
     */
    protected $adminInfo = null;

    /**
     * 白名单控制器（不需要认证）
     */
    protected $whitelist = ['Auth'];

    /**
     * 初始化
     */
    public function _initialize()
    {
        parent::_initialize();

        // 获取当前控制器名
        $controller = $this->request->controller();

        // 检查是否在白名单中
        if (in_array($controller, $this->whitelist)) {
            return;
        }

        // 进行认证检查
        $this->checkAuth();
    }

    /**
     * 认证检查
     */
    private function checkAuth()
    {
        // 获取Authorization头
        $token = $this->request->header('Authorization', '');
        $token = str_replace('Bearer ', '', $token);

        if (empty($token)) {
            $this->unauthorized('请先登录');
        }

        try {
            // 验证会话
            $session = Db::name('sessions')
                ->alias('s')
                ->join('users a', 's.admin_id = a.id')
                ->where('s.token', $token)
                ->where('s.expires_at', '>', date('Y-m-d H:i:s'))
                ->where('a.status', 1)
                ->field('s.admin_id,s.token,s.expires_at,a.username,a.real_name,a.role')
                ->find();

            if (!$session) {
                $this->unauthorized('登录已过期，请重新登录');
            }

            // 更新会话过期时间（滑动过期）
            $newExpiresAt = date('Y-m-d H:i:s', time() + 7200); // 延长2小时
            Db::name('sessions')
                ->where('token', $token)
                ->update([
                    'expires_at' => $newExpiresAt,
                    'updated_at' => date('Y-m-d H:i:s')
                ]);

            // 设置管理员信息
            $this->adminInfo = $session;

        } catch (\Exception $e) {
            $this->unauthorized('认证失败：' . $e->getMessage());
        }
    }

    /**
     * 返回未授权响应
     */
    private function unauthorized($message = '未授权访问')
    {
        header('HTTP/1.1 401 Unauthorized');
        header('Content-Type: application/json');

        echo json_encode([
            'code' => 401,
            'msg' => $message,
            'data' => null
        ]);

        exit;
    }

    /**
     * 获取当前登录管理员信息
     */
    protected function getAdminInfo()
    {
        return $this->adminInfo;
    }

    /**
     * 获取当前登录管理员ID
     */
    protected function getAdminId()
    {
        return $this->adminInfo ? $this->adminInfo['admin_id'] : 0;
    }

    /**
     * 检查管理员权限
     */
    protected function checkPermission($permission = '')
    {
        if (!$this->adminInfo) {
            return false;
        }

        // 超级管理员拥有所有权限
        if ($this->adminInfo['role'] === 'super') {
            return true;
        }

        // 这里可以扩展更细粒度的权限控制
        return true;
    }
}